<?php

/**
 * Mező objektum
 *
 * Értéke a mező nevének részeinek egyszerű felsorolása lehet,
 * vagy használható benne XQL_Function objektum, illetve az 'as'
 * azonosító használatával lehet mezőálnevet létrehozni.
 * 
 * Példa:
 * <code>
 * $o->set(
 * 		array(
 * 			'db',
 * 			'table',
 * 			'field', 
 * 			'as'=>'myfield'
 * 		)
 * );
 * </code>
 * kimenete: `db`.`table`.`field` AS `myfield`
 * 
 * <code>
 * $o->set(
 * 		array(
 * 			XQL_Function::create()->set('count', XQL_Field::create()->set(array('table', 'field'))),
 * 			'as' => 'cnt'
 * 		)
 * );
 * </code>
 * kimenete: count(`table`.`field`) AS `cnt`
 * 
 */
class XQL_Field extends XQL_Object
{
	/**
	 * Az objektum neve. Meg kell egyeznie egy sémának a nevével, amelyre illeszthető.
	 *
	 * @var string
	 */
	protected $objectName = 'field';
	
	/**
	 * A mező rendezési iránya (ha van neki).
	 *
	 * @var string
	 */
	protected $fieldOrder = '';
	
	/**
	 * Felépíti az osztályhoz tartozó sémát. Implementálása kötelező.
	 *
	 */
	protected function buildSchema()
	{
		$this->objectSchema = new XQL_FieldSchema();
	}
	
	/**
	 * Visszatér egy példánnyal ugyanebből az osztályból.
	 *
	 * @return XQL_Field
	 */
	public static function create()
	{
		return new XQL_Field();
	}
	
	/**
	 * Növekvő sorban rendezendőre állítja a mezőt.
	 *
	 * @return XQL_Field Sajátmaga
	 */
	public function orderAsc()
	{
		$this->fieldOrder = 'ASC';
		return $this;
	}
	
	/**
	 * Csökkenő sorban rendezendőre állítja a mezőt.
	 *
	 * @return XQL_Field Sajátmaga
	 */
	public function orderDesc()
	{
		$this->fieldOrder = 'DESC';
		return $this;
	}
	
	/**
	 * Törli a rendezési kitételt.
	 *
	 * @return XQL_Field Sajátmaga
	 */
	public function orderNone()
	{
		$this->fieldOrder = '';
		return $this;
	}
	
	/**
	 * Beállítja a mező rendezési irányát a paraméter alapján. A paraméter
	 * értékei lehetnek: asc, desc, none. A 'none' érték törli a rendezési
	 * kitételt. Érvénytelen érték megadása esetén XQL_E_Field_InvalidOrder kivétel
	 * keletkezik.
	 *
	 * @param string $type
	 * @return XQL_Field Sajátmaga
	 */
	public function order($type='none')
	{
		$method = 'order'.uc_first(strtolower($type));
		
		if (!is_callable(array($this, $method)))
		{
			throw new XQL_E_Field_InvalidOrder($type);
		}
		
		return $this->$method();
	}
	
	/**
	 * Kizárólag ennek az objektumnak az értékével tér vissza. Implementációja
	 * kötelező. A további megvalósításokban ügyelni kell arra, hogy az egyes
	 * érték elemek akár olyan objektumok is lehetnek, amelyek string-ként
	 * térhetnek vissza (például más XQL_Object leszármazottak).
	 *
	 * @return string
	 */
	public function get()
	{
		$value = array();
		$as = '';
		$result = '';
		foreach ($this->objectValue as $k=>$v)
		{
			if ($k !== 'as')
			{
				$value[] = $v;
			}
			else
			{
				$as = (is_object($value['as'])? (string)$value['as'] : '`'.(string)$value['as'].'`');
			}
		}
		foreach ($value as $k=>$v)
		{
			$prefix = ($k == (count($value)-2)? $this->connection->tablePrefix : '');
			$value[$k] = (is_object($v)? (string)$v : '`'.$prefix.(string)$v.'`');
		}

		if (count($value) == 1)
		{
			$result = $value[0];
		}
		else if (count($value) == 2)
		{
			$result = $value[0].'.'.$value[1];
		}
		else if (count($value) == 3)
		{
			$result = $value[0].'.'.$value[1].'.'.$value[2];
		}
		$result = str_replace('`*`', '*', $result);
		if (!empty($as))
		{
			$result .= ' `'.$as.'`';
		}
		if ($this->fieldOrder != '')
		{
			$result .= ' '.$this->fieldOrder;
		}
		
		return $result;
	}
	
}

?>